home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / comm / mail / Mutt089src.lha / Mutt-0.89i-AMIGA / src / pgpinvoke.c < prev    next >
C/C++ Source or Header  |  1998-01-28  |  8KB  |  305 lines

  1. /*
  2.  * Copyright (C) 1997 Thomas Roessler <roessler@guug.de>
  3.  * 
  4.  *     This program is free software; you can redistribute it and/or modify
  5.  *     it under the terms of the GNU General Public License as published by
  6.  *     the Free Software Foundation; either version 2 of the License, or
  7.  *     (at your option) any later version.
  8.  * 
  9.  *     This program is distributed in the hope that it will be useful,
  10.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *     GNU General Public License for more details.
  13.  * 
  14.  *     You should have received a copy of the GNU General Public License
  15.  *     along with this program; if not, write to the Free Software
  16.  *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  */ 
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <unistd.h>
  23. #include <time.h>
  24.  
  25. #include "mutt.h"
  26. #include "state.h"
  27. #include "pgp.h"
  28.  
  29.  
  30. pid_t pgp_invoke_decode (FILE **pgpin, FILE **pgpout, FILE **pgperr,
  31.              int pgpinfd, int pgpoutfd, int pgperrfd,
  32.              const char *fname, int need_passphrase)
  33. {
  34.   char cmd[HUGE_STRING];
  35.   
  36.   switch(pgp_version())
  37.   {
  38.     case PGP2:
  39.       snprintf(cmd, sizeof(cmd), "%scat %s%s | "
  40.            "%s +pubring=%s +secring=%s +verbose=0 +batchmode -f",
  41.            need_passphrase ? "PGPPASSFD=0; export PGPPASSFD; " : "",
  42.            need_passphrase ? "- " : "",
  43.            fname,
  44.            Pgp, PgpPubring, PgpSecring);
  45.       break;
  46.  
  47.     case PGP3:
  48.       snprintf(cmd, sizeof(cmd), "%scat %s%s | "
  49.            "%sv +pubring=%s +secring=%s +verbose=0 +batchmode -f "
  50.            "--OutputInformationFD=2",
  51.            need_passphrase ? "PGPPASSFD=0; export PGPPASSFD; " : "",
  52.            need_passphrase ? "- " : "",
  53.            fname,
  54.            Pgp, PgpPubring, PgpSecring);
  55.       break;
  56.     
  57.     default:
  58.       mutt_error("Unknown PGP version.");
  59.       return -1;
  60.   }
  61.   
  62.   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
  63.                    pgpinfd, pgpoutfd, pgperrfd);
  64. }
  65.  
  66.  
  67. pid_t pgp_invoke_verify(FILE **pgpin, FILE **pgpout, FILE **pgperr,
  68.             int pgpinfd, int pgpoutfd, int pgperrfd,
  69.             const char *signedstuff, const char *sigfile)
  70. {
  71.   char cmd[HUGE_STRING];
  72.   
  73.   switch(pgp_version())
  74.   {
  75.     case PGP2:
  76.       snprintf(cmd, sizeof(cmd), 
  77.            "%s +pubring=%s +secring=%s +batchmode +verbose=0 %s %s",
  78.            Pgp, PgpPubring, PgpSecring, sigfile, signedstuff);
  79.       break;
  80.     
  81.     case PGP3:
  82.       snprintf(cmd, sizeof(cmd),
  83.            "%sv +pubring=%s +secring=%s --OutputInformationFD=1 +batchmode +verbose=0 %s %s",
  84.            Pgp, PgpPubring, PgpSecring, sigfile, signedstuff);
  85.       break;
  86.  
  87.     default:
  88.       mutt_error("Unknown PGP version.");
  89.       return -1;
  90.   }
  91.   
  92.   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
  93.                    pgpinfd, pgpoutfd, pgperrfd);
  94. }
  95.  
  96.  
  97.  
  98. pid_t pgp_invoke_decrypt(FILE **pgpin, FILE **pgpout, FILE **pgperr,
  99.              int pgpinfd, int pgpoutfd, int pgperrfd,
  100.              const char *fname)
  101. {
  102.   char cmd[HUGE_STRING];
  103.   
  104.   switch(pgp_version())
  105.   {
  106.     case PGP2:
  107.       snprintf(cmd, sizeof(cmd),
  108.            "PGPPASSFD=0; export PGPPASSFD; cat - %s | %s +pubring=%s +secring=%s "
  109.            "+verbose=0 +batchmode -f",
  110.            fname, Pgp, PgpPubring, PgpSecring);
  111.       break;
  112.  
  113.     case PGP3:
  114.       snprintf(cmd, sizeof(cmd),
  115.            "PGPPASSFD=0; export PGPPASSFD; cat - %s | %sv +pubring=%s +secring=%s "
  116.            "+verbose=0 +batchmode -f --OutputInformationFD=2",
  117.            fname, Pgp, PgpPubring, PgpSecring);
  118.       break;
  119.  
  120.     default:
  121.       mutt_error("Unknown PGP version.");
  122.       return -1;
  123.  
  124.   }
  125.  
  126.   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
  127.                 pgpinfd, pgpoutfd, pgperrfd);
  128. }
  129.  
  130.  
  131. pid_t pgp_invoke_sign(FILE **pgpin, FILE **pgpout, FILE **pgperr,
  132.               int pgpinfd, int pgpoutfd, int pgperrfd, 
  133.               const char *fname)
  134. {
  135.   char cmd[HUGE_STRING];
  136.   
  137.   switch(pgp_version())
  138.   {
  139.     case PGP2:
  140.       snprintf(cmd, sizeof(cmd),
  141.            "PGPPASSFD=0; export PGPPASSFD; cat - %s | %s "
  142.            "+pubring=%s +secring=%s +verbose=0 +batchmode -abfst %s %s",
  143.            fname, Pgp, PgpPubring, PgpSecring, 
  144.            PgpSignAs[0] ? "-u" : "",
  145.            PgpSignAs[0] ? PgpSignAs : "");
  146.       break;
  147.  
  148.     case PGP3:
  149.       snprintf(cmd, sizeof(cmd),
  150.            "PGPPASSFD=0; export PGPPASSFD; cat - %s | %ss "
  151.            "+pubring=%s +secring=%s +verbose=0 -abft %s %s",
  152.            fname, Pgp, PgpPubring, PgpSecring,
  153.            PgpSignAs[0] ? "-u" : "",
  154.            PgpSignAs[0] ? PgpSignAs : "");
  155.       break;
  156.  
  157.     default:
  158.       mutt_error("Unknown PGP version.");
  159.       return -1;
  160.  
  161.   }
  162.   
  163.   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
  164.                    pgpinfd, pgpoutfd, pgperrfd);
  165. }
  166.  
  167.  
  168. pid_t pgp_invoke_encrypt(FILE **pgpin, FILE **pgpout, FILE **pgperr,
  169.              int pgpinfd, int pgpoutfd, int pgperrfd,
  170.              const char *fname, const char *uids, int sign)
  171. {
  172.   char cmd[HUGE_STRING];
  173.   char tmpcmd[HUGE_STRING];
  174.   char *cp;
  175.   char *keylist;
  176.   
  177.   switch(pgp_version())
  178.   {
  179.     case PGP2:
  180.       snprintf(cmd, sizeof(cmd),
  181.            "%scat %s%s | %s +pubring=%s +secring=%s +verbose=0 %s +batchmode -aeft%s %s%s %s",
  182.            sign ? "PGPPASSFD=0; export PGPPASSFD; " : "",
  183.            sign ? "- " : "",
  184.            fname,
  185.            Pgp, PgpPubring, PgpSecring, 
  186.            option(OPTPGPENCRYPTSELF) ? "+encrypttoself" : "",
  187.            sign ? "s" : "",
  188.            sign && PgpSignAs[0] ? "-u " : "",
  189.            sign && PgpSignAs[0] ? PgpSignAs : "",
  190.            uids);
  191.       break;
  192.  
  193.     case PGP3:
  194.       snprintf(cmd, sizeof(cmd),
  195.            "%scat %s%s | %se +pubring=%s +secring=%s +verbose=0 %s +batchmode -aft%s %s%s",
  196.            sign ? "PGPPASSFD=0; export PGPPASSFD; " : "",
  197.            sign ? "- " : "",
  198.            fname,
  199.            Pgp, PgpPubring, PgpSecring, 
  200.            option(OPTPGPENCRYPTSELF) ? "+encrypttoself" : "",
  201.            sign ? "s" : "",
  202.            sign && PgpSignAs[0] ? "-u " : "",
  203.            sign && PgpSignAs[0] ? PgpSignAs : "");
  204.  
  205.       keylist = safe_strdup(uids);
  206.       for(cp = strtok(keylist, " "); cp ; cp = strtok(NULL, " "))
  207.       {
  208.     snprintf(tmpcmd, sizeof(tmpcmd), "%s -r %s", 
  209.          cmd, cp);
  210.     strcpy(cmd, tmpcmd);
  211.       }
  212.       safe_free((void **) &keylist);
  213.       break;
  214.  
  215.     default:
  216.       mutt_error("Unknown PGP version.");
  217.       return -1;
  218.  
  219.   }
  220.   
  221.   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, 
  222.                    pgpinfd, pgpoutfd, pgperrfd);
  223. }
  224.  
  225.  
  226. void pgp_invoke_extract(const char *fname)
  227. {
  228.   char cmd[HUGE_STRING];
  229.   
  230.   switch(pgp_version())
  231.   {
  232.     case PGP2:
  233.       snprintf(cmd, sizeof(cmd), "%s +pubring=%s +secring=%s -ka %s",
  234.            Pgp, PgpPubring, PgpSecring, fname);
  235.       break;
  236.  
  237.     case PGP3:
  238.       snprintf(cmd, sizeof(cmd), "%sk +pubring=%s +secring=%s --OutputInformationFD=1 %s",
  239.            Pgp, PgpPubring, PgpSecring, fname);
  240.       break;
  241.  
  242.     default:
  243.       mutt_error("Unknown PGP version.");
  244.       return;
  245.  
  246.   }
  247.   mutt_system(cmd);
  248. }
  249.  
  250.  
  251. pid_t pgp_invoke_verify_key(FILE **pgpin, FILE **pgpout, FILE **pgperr,
  252.                 int pgpinfd, int pgpoutfd, int pgperrfd, const char *id)
  253. {
  254.   char cmd[HUGE_STRING];
  255.   
  256.   switch(pgp_version())
  257.   {
  258.     case PGP2:
  259.       snprintf(cmd, sizeof(cmd), "%s +pubring=%s +secring=%s +batchmode -kcc 0x%8s",
  260.            Pgp, PgpPubring, PgpSecring, id);
  261.       break;
  262.  
  263.     case PGP3:
  264.       snprintf(cmd, sizeof(cmd), "%sk +pubring=%s +secring=%s +batchmode -c --OutputInformationFD=1 0x%8s",
  265.            Pgp, PgpPubring, PgpSecring, id);
  266.       break;
  267.  
  268.     default:
  269.           mutt_error("Unknown PGP version.");
  270.       return -1;
  271.     
  272.   }
  273.   
  274.   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
  275.                    pgpinfd, pgpoutfd, pgperrfd);
  276. }
  277.  
  278.  
  279. pid_t pgp_invoke_extract_key(FILE **pgpin, FILE **pgpout, FILE **pgperr,
  280.                  int pgpinfd, int pgpoutfd, int pgperrfd, const char *id)
  281. {
  282.   char cmd[HUGE_STRING];
  283.   
  284.   switch(pgp_version())
  285.   {
  286.     case PGP2:
  287.       snprintf(cmd, sizeof(cmd), "%s -kxaf +pubring=%s +secring=%s 0x%8s",
  288.            Pgp, PgpPubring, PgpSecring, id);
  289.       break;
  290.  
  291.     case PGP3:
  292.       snprintf(cmd, sizeof(cmd), "sk -xa +pubring=%s +secring=%s --OutputInformationFD=1 0x%8s",
  293.            Pgp, PgpPubring, PgpSecring, id);
  294.       break;
  295.  
  296.     default:
  297.       mutt_error("Unknown PGP version.");
  298.       return -1;
  299.  
  300.   }
  301.   
  302.   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
  303.                    pgpinfd, pgpoutfd, pgperrfd);
  304.